#include "../include/spinlock.h"
#include "../include/types.h"

// 初始化自旋锁
void initlock(struct spinlock *lock, const char *name) {
    lock->locked = 0;
    lock->name = (char*)name;
}

// 获取锁（自旋等待，直到获取成功）
void acquire(struct spinlock *lock) {
    // 禁用中断（避免死锁：防止获取锁后被中断，其他线程也尝试获取）
    asm volatile("csrrci zero, sie, 1" : : : "memory");
    
    // 自旋等待锁释放，并用原子操作获取锁（避免并发冲突）
    while (__sync_lock_test_and_set(&lock->locked, 1) != 0);
    
    // 内存屏障：确保锁获取后的操作不被重排序
    asm volatile("fence" : : : "memory");
}

// 释放锁
void release(struct spinlock *lock) {
    // 内存屏障：确保锁释放前的操作已完成
    asm volatile("fence" : : : "memory");
    
    // 原子操作释放锁（置0）
    __sync_lock_release(&lock->locked);
    
    // 启用中断
    asm volatile("csrrsi zero, sie, 1" : : : "memory");
} 

